package cool.qingqing.oprational;

/**
 * @author 高山青
 * @Date 2022/1/5  -   10:45
 */

import cool.qingqing.streamapi.Person;
import org.testng.annotations.Test;

import java.util.Optional;

/**
 * Oprational的由来
 */
public class OprationalDemo01<test01> {
	/**
	 * 以前对Null的处理
	 */
	@Test
	public void test01() {
	String name=null;
	if(name != null){
		System.out.println(name);
	}else{
		System.out.println("值是null的");
	}

	}

	/**
	 * Oprational三种创建方式
	 */
	@Test
	public void test02() {

		String name=null;
		/**
		 * java.lang.NullPointerException
		 */
		//Optional op1=Optional.of(name);


		Optional op2=Optional.ofNullable(name);
		Optional op3=Optional.empty();
//		System.out.println(op1);
		System.out.println(op2);
		System.out.println(op3);
	}

	/**
	 *Oprational的常用方法
	 */
	@Test
	public void test03() throws RuntimeException {
		Optional<String> op1 = Optional.ofNullable("张三");
		Optional<Object> op2 = Optional.empty();
		System.out.println(op1.get());
		/**
		 * get方法经常与isPresent一起使用
		 */
		if (op2.isPresent()){
			System.out.println(op2.get());
		}else{
			System.out.println("值是空的");
		}
		/**
		 * orElse当值是空的时候值是李四
		 */
		op1.orElse("李四");
		System.out.println(op1.get());
		if (op2.isPresent()){
			System.out.println(op2.get());
		}else{
			System.out.println(op2.orElse("李四"));
		}

		op1.orElseThrow(()->new RuntimeException("这是一个有异常的类"));
		//捕获异常之后也不会在执行了。
		System.out.println("继续执行吗？");


		//如果存在值就做社么？
		op1.ifPresent(System.out::println);

		Person person=new Person("高山青",26);
		String name01=getName(person);
		System.out.println(name01);
		Optional.ofNullable(person);
		String name02 = getNameOpration(Optional.ofNullable(person));
		System.out.println(name02);


	}

	/**
	 * 名字转化成大写,传统方式
	 */
	public String getName(Person person) {
	if(person!=null){
		String name=person.getName();
		if(name!=null){
			person.setName(name.toUpperCase());
			return person.getName();
		}else{
			return "name值是空的";
		}
	}
	return "对象是空的";
	}
	/**
	 * Oprational的方式
	 */
	public String getNameOpration(Optional<Person> optional){

		if(optional.isPresent()){
			return optional
					.map(Person::getName)
					.map(String::toUpperCase)
					.orElse("name值是空的");
		}else{
			return "对象是空的";
		}

	}
	/**
	 * 抛出异常到方法上进行捕获
	 */
	@Test
	public void test04() {
		try {
			test03();
		}catch (RuntimeException e){
			System.out.println(e.getMessage());
		}

	}

}
